package com.kamistoat.meimeimall.meimeimallauthserver.web;

import com.kamistoat.meimeimall.common.annotation.DubboAndHTTPExceptionCatch;
import com.kamistoat.meimeimall.common.dubboInterface.MemberDubboInterface;
import com.kamistoat.meimeimall.common.exception.BizCodeEnum;
import com.kamistoat.meimeimall.common.utils.R;
import com.kamistoat.meimeimall.meimeimallauthserver.service.AuthService;
import com.kamistoat.meimeimall.meimeimallauthserver.vo.UserRegisterVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.dubbo.config.annotation.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.HashMap;
import java.util.Map;

@Api(tags = "注册页操作")
@RestController
@RequestMapping("web")
public class RegisterPageController {
    protected Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    AuthService authService;
    @Autowired
    StringRedisTemplate stringRedisTemplate;

    /**
     * 当注册页面点击发送验证码时，页面并不会跳转，只是会向下面的路径发送带参数请求
     * 请求数据就是用户的手机号
     * 向redis中保存值，key就是 sms:code:手机号，值就是验证码_当前系统时间
     * 然后远程调用third模块中的短信发送接口
     *
     * @param phoneNum 用户手机号
     * @return R
     */
    @ApiOperation("注册时发送短信验证码")
    @GetMapping("/register/send_code")
    @DubboAndHTTPExceptionCatch
    public R sendCode(@RequestParam String phoneNum) {
        authService.sendCode(phoneNum);
        return R.ok();
    }

    /**
     * 验证码校验
     *
     * @param phoneNum 用户手机号
     * @param code     用户输入验证码
     * @return R
     */
    @ApiOperation("注册验证码校验")
    @GetMapping("/register/verify_code")
    @DubboAndHTTPExceptionCatch
    public R codeAuth(@RequestParam String phoneNum, @RequestParam String code) {
        authService.verifyCode(phoneNum, code);
        return R.ok();
    }


    /**
     * 注册。点击注册后向数据库中保存用户信息，然后跳转回到登录页面。开启数据校验
     *
     * @param userRegisterVo 用户注册Vo
     * @param result         校验结果
     * @return R
     */
    @ApiOperation("保存用户注册信息")
    @PostMapping("/register")
    @DubboAndHTTPExceptionCatch
    public R register(@Valid UserRegisterVo userRegisterVo, BindingResult result) {
        Map<String, String> validationErrors = new HashMap<>();
        if (result.hasErrors()) {
            // 二次校验，首次校验在前端完成
            for (FieldError fieldError : result.getFieldErrors()) {
                String field = fieldError.getField();
                String defaultMessage = fieldError.getDefaultMessage();
                validationErrors.put(field, defaultMessage);
            }
            return R.error(BizCodeEnum.VALID_EXCEPTION.getCode(), BizCodeEnum.VALID_EXCEPTION.getMessage()).put("validationErrors", validationErrors);
        }
        authService.register(userRegisterVo);
        return R.ok();
    }

    /**
     * 校验用户名是否重复
     * @param username 用户用户名
     * @return R
     */
    @ApiOperation("检查用户名是否重复")
    @GetMapping("/register/check_username")
    @DubboAndHTTPExceptionCatch
    public R usernameUnique(@RequestParam String username) {
        authService.checkUserName(username);
        return R.ok();
    }
}
